home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 7: Sunsite
/
Linux Cubed Series 7 - Sunsite Vol 1.iso
/
system
/
mail
/
mailleds.93
/
mailleds
/
mailleds-0.93
/
leds.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-14
|
3KB
|
146 lines
#include <unistd.h>
#include <linux/kd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#ifdef X_SUPPORT
#include <X11/X.h>
#include <X11/Xlib.h>
#endif
#include "config.h"
#include "mailleds.h"
#include "port.h"
#define TTY_RECOVERABLE_ERROR 8
extern int ct[MAX_CONSOLES];
extern char opt_t, opt_x, *opt_d;
extern int x_leds[3];
#ifdef X_SUPPORT
extern Display *dpy;
#endif
extern int kbd_leds, port_leds;
extern sig_atomic_t exit_now;
void set_kbd_leds(leds)
int leds;
{
int kbd_ledstate, x;
for (x = 0; ct[x] != -1; x++) {
kbd_ledstate = get_kbd_leds(ct[x]);
if (kbd_ledstate == TTY_RECOVERABLE_ERROR)
continue;
poke_kbd_leds(ct[x], leds | kbd_ledstate);
}
}
void poke_kbd_leds(fd, leds)
int fd, leds;
{
if (ioctl(fd, KDSETLED, leds)) {
#ifdef DEBUG
write(2, &"01"[(leds & 0x80) != 0], 1);
#else
perror("mailleds: ioctl KDSETLED");
exit(1);
#endif
}
}
int get_kbd_leds(fd)
int fd;
{
char ledstate;
if (ioctl(fd, KDGETLED, &ledstate)) {
if (errno == EIO)
return (TTY_RECOVERABLE_ERROR);
perror("mailleds: ioctl KDGETLED");
/* EIO seems to be generated when logouts are happening nearly simultaneously.
not serious. Ignore, and make the other skip the tty. */
exit(1);
}
return (ledstate);
}
#ifdef PARALLEL_SUPPORT
void set_port_leds(port, leds)
int port, leds;
{
int state;
state = port_in(port);
port_out(port, leds | state);
}
void unset_port_leds(port, leds)
int port, leds;
{
int state;
state = port_in(port);
port_out(port, leds ^ state);
}
#endif /* PARALLEL_SUPPORT */
#ifdef X_SUPPORT
void set_x_leds(mode)
int mode;
{
int x;
XKeyboardControl kbd;
kbd.led_mode = mode;
for (x = 0; x_leds[x]; x++) {
kbd.led = x_leds[x];
XChangeKeyboardControl(dpy, KBLed | KBLedMode, &kbd);
}
}
#endif
/* theoretically, one of these days the pauses will be command line switches */
void blink_once(on_pause, off_pause)
unsigned long on_pause, off_pause;
{
if (opt_t)
set_kbd_leds(kbd_leds);
#ifdef X_SUPPORT
if (opt_x) {
dpy = XOpenDisplay(opt_d);
set_x_leds(LedModeOn);
XCloseDisplay(dpy);
}
#endif
#ifdef PARALLEL_SUPPORT
if (port_leds)
set_port_leds(LPT_PORT, port_leds);
#endif
usleep(on_pause);
if (opt_t)
set_kbd_leds(0xff);
#ifdef X_SUPPORT
if (opt_x) {
dpy = XOpenDisplay(opt_d);
set_x_leds(LedModeOff);
XCloseDisplay(dpy);
}
#endif
#ifdef PARALLEL_SUPPORT
if (port_leds)
unset_port_leds(LPT_PORT, port_leds);
#endif
usleep(off_pause);
}
void blink_x(on_pause, off_pause, x)
unsigned long on_pause;
unsigned long off_pause;
int x;
{
for (; x && !exit_now; x--)
blink_once(on_pause, off_pause);
}